import EventEmitter from 'events';

import { log } from './logger';

/**
 * 将驼峰命名转换为事件名
 * 例如: themeChanged -> theme:changed
 * 例如: autoStartChanged -> autoStart:changed
 */
function camelToEventName(camelCase: string): string {
  // 移除末尾的 Changed 后缀
  const withoutChanged = camelCase.replace(/Changed$/, '');

  // 直接添加 :changed 后缀，保持原有的驼峰命名
  return withoutChanged + ':changed';
}

class EventBus extends EventEmitter {
  constructor() {
    super();
  }

  /**
   * 初始化事件消费者
   */
  initConsumers(): void {
    log.info('🎯 开始初始化事件消费者...');

    try {
      // 使用 Vite 的 import.meta.glob 来查找事件处理器文件
      const modules = import.meta.glob('../events/**/*.ts', { eager: true });

      const moduleCount = Object.keys(modules).length;
      log.info(`📁 通过glob发现 ${moduleCount} 个潜在的事件处理器文件`);

      const registeredEvents: string[] = [];
      let totalRegisteredCount = 0;

      for (const moduleRelativePath in modules) {
        const moduleContent = modules[moduleRelativePath] as Record<string, any>;

        if (moduleContent) {
          // 从路径中提取模块名 (例如: ../events/themeChanged.ts -> themeChanged)
          const moduleName =
            moduleRelativePath
              .split('/')
              .pop()
              ?.replace(/\.(ts|js)$/, '') || '';

          try {
            let registeredCount = 0;

            // 方式1: 支持默认导出 - 文件名以Changed结尾
            if (
              moduleName.endsWith('Changed') &&
              moduleContent.default &&
              typeof moduleContent.default === 'function'
            ) {
              // 将文件名转换为事件名
              const eventName = camelToEventName(moduleName);

              // 注册事件监听器
              this.on(eventName, moduleContent.default as (...args: any[]) => void);

              registeredEvents.push(`  '${eventName}' -> ${moduleName}(默认导出)`);
              registeredCount++;
            }
            // 方式2: 支持命名导出 - 方法名以Changed结尾
            else {
              // 遍历所有导出的方法
              for (const [methodName, method] of Object.entries(moduleContent)) {
                if (typeof method === 'function' && methodName.endsWith('Changed')) {
                  // 将方法名转换为事件名
                  const eventName = camelToEventName(methodName);

                  // 注册事件监听器
                  this.on(eventName, method as (...args: any[]) => void);

                  registeredEvents.push(`  '${eventName}' -> ${moduleName}.${methodName}`);
                  registeredCount++;
                }
              }
            }

            if (registeredCount > 0) {
              totalRegisteredCount += registeredCount;
            }
          } catch (error) {
            log.error(`❌ 注册事件消费者 ${moduleName} 失败:`, error);
          }
        } else {
          log.warn(`⚠️ 无法加载模块内容: ${moduleRelativePath}`);
        }
      }

      // 输出所有注册的事件处理器列表
      if (registeredEvents.length > 0) {
        log.info('📊 已注册的事件处理器: [');
        registeredEvents.forEach((event) => log.info(event));
        log.info(']');
        log.info(`🎉 事件消费者初始化完成，共注册了 ${totalRegisteredCount} 个事件处理器`);
      } else {
        log.warn('⚠️ 没有注册任何事件处理器');
      }
    } catch (error) {
      log.error('❌ 初始化事件消费者失败:', error);
    }
  }
}

export const eventBus = new EventBus();
